package com.wyw.learning.offer;

/**
 * 旋转数组的最小数字
 *
 *  把一个数组最开始的若干个元素搬到数组的末尾，我们称之为数组的旋转。
 *
 * 给你一个可能存在 重复 元素值的数组 numbers ，它原来是一个升序排列的数组，并按上述情形进行了一次旋转。请返回旋转数组的最小元素。
 * 例如，数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一次旋转，该数组的最小值为 1。  
 *
 * 注意，数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。
 *
 * @Author Mr Wu yewen.wu.china@gmail.com
 * @Date 2023/2/20 14:38
 */
public class Offer011 {
    public static void main(String[] args) {
//        int[] numbers = new int[]{2,2,2,0,1};
        int[] numbers = new int[]{9,1,2,3,4,5,6,7,8};
        System.out.println(minArray(numbers));
    }

    // 因为数组是由一个升序排列的数组旋转过来的，所以比较相邻两个数据即可
//    public static int minArray(int[] numbers) {
//        int len = numbers.length;
//        int i = 0;
//        int j =1;
//        if(len == 1)
//            return numbers[0];
//
//        while (j < len) {
//            if(numbers[i] > numbers[j])
//                return numbers[j];
//            i++;
//            j++;
//        }
//
//        return numbers[0];
//    }

    // 二分
    public static int minArray(int[] numbers) {
        int l = 0, r = numbers.length - 1;
        while (l < r) {
            int mid = ((r - l) >> 1) + l;
            //只要右边比中间大，那右边一定是有序数组
            if (numbers[r] > numbers[mid]) {
                r = mid;
            } else if (numbers[r] < numbers[mid]) {
                l = mid + 1;
                //去重
            } else r--;
        }
        return numbers[l];
    }
}
